/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.aratuk.manager;

import br.com.aratuk.modelo.*;
import br.com.aratuk.servico.ApostaServico;
import br.com.aratuk.servico.JogoServico;
import br.com.aratuk.servico.LinhaServico;
import br.com.aratuk.servico.LoteriaServico;
import br.com.aratuk.servico.ResultadoJogoServico;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerResultado implements Serializable {

    @EJB
    LoteriaServico loteriaServico;
    @EJB
    JogoServico jogoServico;
    @EJB
    ApostaServico apostaServico;
    @EJB
    ResultadoJogoServico resultadoJogoServico;
    @EJB
    LinhaServico linhaServico;
    private Loteria loteria;
    private Jogo jogo;
    private String ticket;
    private Integer multiplicador;

    private List<ResultadoLinha> resultadoLinhas;
    
    @PostConstruct
    public void init() {
        this.loteria = new Loteria();
    }

    public Loteria getLoteria() {
        return loteria;
    }

    public void setLoteria(Loteria loteria) {
        this.loteria = loteria;
    }

    public List<Jogo> pesquisarPorLoteria(String query) {
        return (List<Jogo>) jogoServico.pesquisarPorLoteria(loteria);
    }

    public Jogo getJogo() {
        return jogo;
    }

    public void setJogo(Jogo jogo) {
        this.jogo = jogo;
    }

    public String getTicket() {
        return ticket;
    }

    public void setTicket(String ticket) {
        this.ticket = ticket;
    }

    public Integer getMultiplicador() {
        return multiplicador;
    }

    public void setMultiplicador(Integer multiplicador) {
        this.multiplicador = multiplicador;
    }

    public void salvar() {
        ResultadoJogo resultado = null;
        List<ResultadoJogo> resultados = resultadoJogoServico.jsonToResultadoJogo(ticket);
        resultadoLinhas = new ArrayList<ResultadoLinha>();
        
        if (resultados != null && !resultados.isEmpty()) {
            resultado = resultados.get(0);
            resultado.setJogo(jogo);
            
            if (multiplicador != null) {
                resultado.setMultiplicador(multiplicador);
            }

            List<Aposta> apostas = apostaServico.apostaPorJogo(jogo);
            ResultadoLinha rl;
            for (Aposta aposta : apostas) {
                for (Linha linha : aposta.getLinhas()) {
                    rl = new ResultadoLinha();
                    
                    if (resultado.getNumeroSorteado() != null) {
                        final HashSet<Integer> numeroSorteado = new HashSet<Integer>();
                        numeroSorteado.addAll(resultado.getNumeroSorteado());
                        
                        rl.setNumerosAcertados(numeroSorteado);
                        rl.getNumerosAcertados().retainAll(linha.getNumero());
                        rl.setQtdAcertosNumero(rl.getNumerosAcertados().size());
                    }
                    if (resultado.getBolaExtraSorteado() != null) {
                        final HashSet<Integer> bolasExtras = new HashSet<Integer>();
                        bolasExtras.addAll(resultado.getBolaExtraSorteado());
                        
                        rl.setBolasExtrasAcertadas(bolasExtras);
                        rl.getBolasExtrasAcertadas().retainAll(linha.getBolasExtra());
                        rl.setQtdAcertoBolaExtra(rl.getBolasExtrasAcertadas().size());
                    }
                    rl.setResultadoJogo(resultado);
                    rl.setLinha(linha);
                    resultadoLinhas.add(rl);
                }
            }
        }
        System.err.println(resultado);
    }

    public List<ResultadoLinha> getResultadoLinhas() {
        return resultadoLinhas;
    }

    public void setResultadoLinhas(List<ResultadoLinha> resultadoLinhas) {
        this.resultadoLinhas = resultadoLinhas;
    }
    
}
